package com.company;

import java.util.TreeMap;

/**
 * @ClassName:
 * @author:
 * @Description:
 * @Date
 **/
//实现一个 MapSum 类，支持两个方法，insert 和 sum：
//
//MapSum() 初始化 MapSum 对象
//void insert(String key, int val) 插入 key-val 键值对，字符串表示键 key ，整数表示值 val 。如果键 key 已经存在，那么原来的键值对将被替代成新的键值对。
//int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。
//
//来源：力扣（LeetCode）
//链接：https://leetcode-cn.com/problems/map-sum-pairs
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
public class Leetcode677 {
    private class Node {
        public int value;
        public TreeMap<Character, Node> next;

        public Node(int value) {
            this.value = value;
            next = new TreeMap<>();
        }

        public Node() {
            this(0);
        }
    }

    private Node root;

    public Leetcode677() {
        root = new Node();
    }

    public void insert(String word, int val) {
        Node current = root;
        for (int i = 0; i < word.length(); i++) {
            char c = word.charAt(i);
            if (current.next.get(c) == null) {
                current.next.put(c, new Node());
            }
            current = current.next.get(c);
        }
        current.value = val;
    }

    public int sum(String prefix) {
        Node current = root;
        for (int i = 0; i < prefix.length(); i++) {
            char c = prefix.charAt(i);
            if (current.next.get(c) == null) {
                return 0;
            }
            current = current.next.get(c);
        }
        return sum(current);
    }

    private int sum(Node node) {
        if (node.next.size() == 0) {
            return node.value;
        }
        int res = node.value;
        for (char c : node.next.keySet()) {
            res += sum(node.next.get(c));
        }
        return res;
    }
}
